#ifndef GAMEROOM_H
#define GAMEROOM_H

#include <QWidget>
#include <qDebug>
#include <QMessageBox>
#include <QSound>
// 蛇的移动方向
enum class SnakeDirect{
    UP = 0,
    DOWN,
    LEFT,
    RIGHT
};

enum class GameStyle{
    SIMPLE = 0,
    NORMAL,
    COMPLEX
};



class GameRoom : public QWidget
{
    Q_OBJECT
public:
    explicit GameRoom(QWidget *parent = nullptr);

    // 重写绘图对象
    void paintEvent(QPaintEvent *event);

    // 蛇的移动速度
    void snakeMoveTimeout(int timeout){
        moveTimeout = timeout;
    }

    // 游戏难度
    void styleGameRoom(GameStyle style)
    {
        styleRoom = style;
    }

    // 游戏是否失败
    bool checkFail();

    //创建食物
    void createNewFood();

    // 移动方向
    void moveUp();
    void moveDown();
    void moveLeft();
    void moveRight();


private:

    // 游戏难度
    GameStyle styleRoom = GameStyle::NORMAL;


        /* 蛇的属性 */
    /* ------------------------------------------------------------------------------------------------------------ */
    // 首先是蛇的链表，链表是由一个个矩形组成的，我们要规定一下蛇结点的长度
    const int ksnakeNodeWidth = 20;
    const int ksnakeNodeHeight = 20;

    QList<QRectF> snakeList;

    // 用蛇的移动速度来设计不同难度的关卡
    const int kDefaultTimeout = 300;// 固定的移动速度
    int moveTimeout = kDefaultTimeout;// 需要设计一个函数，让moveTimeout的值可以与关卡难度值匹配

    // 蛇的移动方向    使用枚举 将蛇的移动方向列举出来， 默认蛇的移动方向为向上移动
    SnakeDirect moveDirect = SnakeDirect::UP;


    /* ------------------------------------------------------------------------------------------------------------ */

    // 食物节点  蛇吃到食物，就相当于 蛇头结点 接触到 食物节点  ，蛇链表插入一个结点
    QRectF foodNode;


    // 其他变量
    // 音乐
    QSound *sound;

    // 定时器
    QTimer *timer;

    // 游戏是否开始
    bool isGameStart = false;
};

#endif // GAMEROOM_H
